Homework 4
Sequence
Q1: Deep Map
写一个函数deep_map,使得传入的列表s(s可能是嵌套列表)中的每一个元素替换为该元素传入函数f后的返回值
每一个元素包括嵌套列表中的每一个元素
提示:
type(a)==list会返回True如果a是列表
1 | def deep_map(f, s): |
遍历列表下标i,如果发现内部有嵌套列表,就递归进入遍历嵌套列表,若当前位置为一般元素,则调用函数并将结果替换
Data Abstraction
要用到的ADT
Mobile:一种悬挂雕像
- 一个mobile一定有一个左arm和一个右arm
- 一个arm有一个正数大小的长度,且尾端一定挂着一个mobile或一个planet
- 一个planet有一个正数大小的质量,且没有东西挂在上面
Q2: Mass
补充完成构造器planet与选择器mass
使得每一格planet用一个二元列表表示:['planet', mass]
其中total_mass函数可以用来计算一个planet或一个mobile的质量
1 | def planet(mass): |
按照提示构造即可
Q3: Balanced
实现balanced函数,判断m是否是一个”balanced mobile”
“balanced mobile”的定义如下:
- 左arm的扭矩等于右arm的扭矩,其中扭矩为左arm的长度与挂在左arm上的质量之积
- 挂在arm尾端的mobile自身为balanced mobile,planet自身也是balanced的
提示:使用
total_mass函数,选择器函数,不要逾越ADT的屏障
1 | def balanced(m): |
这个结构类似树,我们可以递归的求解这个问题
- Base case:若传入的是一个planet,则返回True,因为planet在这个结构中类似叶子节点,是整个mobile的终点
- 递归:每次需要比较mobile的左右扭矩是否相等,同时递归比较左右arm下的左右扭矩是否相等,直到递归到planet直接返回True
Trees
Q4: Maximum Path Sum
写一个函数,返回树上从根节点到叶子节点的所有路径中节点权值总和最大值
1 | def max_path_sum(t): |
使用递归遍历
先直接深入到叶子节点,发现叶子节点则返回节点权值,再往前返回,每上一个节点返回已经求和的值+当前节点权值,且每次遍历取当前不同路径的最大值